package negocio;

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;

/*
 * Modela um personagem/elemento do jogo
 */
public class Jogador {
    private Jogo jogo;
    private Image imagem;
    private int x;
    private int y;
    private int largura;
    private int altura;
    private int dirX;
    private int dirY;
    private int pontuacao;

    public Jogador(String nomeImagem, Jogo jp) {
        ImageIcon iicon = new ImageIcon(this.getClass().getClassLoader().getResource(nomeImagem));
        this.imagem = iicon.getImage();
        this.jogo = jp;
        this.x = 0;
        this.y = 0;
        this.largura = imagem.getWidth(null);
        this.altura = imagem.getHeight(null);
    }

    /*
     * Executa uma unidade de movimento de acordo com as teclas pressionadas
     */
    public void move() {
        deslocaX(dirX);
        deslocaY(dirY);
    }

    /*
     * Método chamado pela apresentação na ocorrência de um evento de tecla
     * pressionada. Define a direção e velocidade do movimento
     */
    public void teclaPressionada(KeyEvent evento) {
        switch (evento.getKeyCode()) {
            case KeyEvent.VK_LEFT:
                dirX = -3; // move para a esquerda
                break;
            case KeyEvent.VK_RIGHT:
                dirX = 3; // move para a direita
                break;
            case KeyEvent.VK_UP:
                dirY = -3; // move para cima
                break;
            case KeyEvent.VK_DOWN:
                dirY = 3; // move para baixo
                break;
        }
    }

    /*
     * Método chamado pela apresentação na ocorrência de um evento de tecla
     * levantada.
     */
    public void teclaSolta(KeyEvent evento) {
        switch (evento.getKeyCode()) {
            case KeyEvent.VK_LEFT:
                dirX = 0;
                break;
            case KeyEvent.VK_RIGHT:
                dirX = 0;
                break;
            case KeyEvent.VK_UP:
                dirY = 0;
                break;
            case KeyEvent.VK_DOWN:
                dirY = 0;
                break;
        }
    }

    /*
     * Retorna um objeto Retângulo que permite comparar a colisão de elementos
     */
    public Rectangle getLimites() {
        return new Rectangle(x, y, largura, altura);
    }

    public void deslocaX(int ix) {
        this.x = Math.min(jogo.getLargura() - largura, Math.max(0, this.x + ix));
    }

    public void deslocaY(int iy) {
        this.y = Math.min(jogo.getAltura() - altura, Math.max(0, this.y + iy));
    }

    public void pontua(int pontuacao) {
        this.pontuacao += pontuacao;
    }

    public int getPontuacao() {
        return pontuacao;
    }

    public Image getImagem() {
        return imagem;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getLargura() {
        return largura;
    }

    public int getAltura() {
        return altura;
    }
}
